package com.xiaoxin.smartbi.manager;

import com.xiaoxin.smartbi.config.XingHuoConfig;
import io.github.briqt.spark4j.SparkClient;
import io.github.briqt.spark4j.constant.SparkApiVersion;
import io.github.briqt.spark4j.exception.SparkException;
import io.github.briqt.spark4j.model.SparkMessage;
import io.github.briqt.spark4j.model.SparkSyncChatResponse;
import io.github.briqt.spark4j.model.request.SparkRequest;
import io.github.briqt.spark4j.model.response.SparkTextUsage;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * 调用Ai功能类
 */
@Service
public class AiManager {

    @Resource
    private XingHuoConfig xingHuoConfig;

    public String result(String goal){
        SparkClient sparkClient = xingHuoConfig.sparkClient();
        // 消息列表，可以在此列表添加历史对话记录
        List<SparkMessage> messages=new ArrayList<>();
        messages.add(SparkMessage.systemContent(
                "请严格按照下面的输出格式生成结果，且不得添加任何多余内容（例如无关文字、注释、代码块标记或反引号）\n"+
                "【【【【\n"+
                "{ 生成 Echarts V5 的 option 配置对象 JSON 代码，要求为合法 JSON 格式且不含任何额外内容（如注释或多余字符）}\n"+
                "【【【【\n"+
                "结论： {提供对数据的详细分析结论，内容应尽可能准确、详细，不允许添加其他无关文字或注释 }\n"+
                "示例：\n"+
                "输入：\n"+
                "分析需求：\n"+
                "分析网站用户增长情况，请使用柱状图展示\n"+
                "原始数据：\n"+
                "日期,用户数\n"+
                "1号,10\n"+
                "2号,20\n"+
                "3号,30\n"+
                "期望输出：\n" +
                "【【【【\n"+
                "{ title: { text: 分析网站用户增长情况 }, xAxis: { type: category, data: [1号, 2号, 3号] }, yAxis: { type: value }, series: [ { name: 用户数, type: bar, data: [10, 20, 30] } ] }\n"+
                "【【【【\n"+
                "结论：从数据看，网站用户数由1号的10人增长到2号的20人，再到3号的30人，呈现出明显的上升趋势。这表明在这段时间内网站用户吸引力增强，可能与推广活动、内容更新或其他外部因素有关。"
        ));
        messages.add(SparkMessage.userContent(goal));
        // 构造请求
        SparkRequest sparkRequest=SparkRequest.builder()
        // 消息列表
                .messages(messages)
        // 模型回答的tokens的最大长度,非必传，默认为2048。
        // V1.5取值为[1,4096]
        // V2.0取值为[1,8192]
        // V3.0取值为[1,8192]
                .maxTokens(4096)
        // 核采样阈值。用于决定结果随机性,取值越高随机性越强即相同的问题得到的不同答案的可能性越高 非必传,取值为[0,1],默认为0.5
                .temperature(0.5)
        // 指定请求版本，默认使用最新3.0版本
                .apiVersion(SparkApiVersion.V4_0)
                .build();
        try {
            // 同步调用
            SparkSyncChatResponse chatResponse = sparkClient.chatSync(sparkRequest);
            SparkTextUsage textUsage = chatResponse.getTextUsage();

            System.out.println("\n回答：" + chatResponse.getContent());
            System.out.println("\n提问tokens：" + textUsage.getPromptTokens()
                    + "，回答tokens：" + textUsage.getCompletionTokens()
                    + "，总消耗tokens：" + textUsage.getTotalTokens());
            return chatResponse.getContent();
        } catch (SparkException e) {
            System.out.println("发生异常了：" + e.getMessage());
        }
        return "";
    }

}
